#include "imagemodel.h"
#include <QBitArray>
#include <QDebug>

ImageModel::ImageModel(QBitArray * bitArray, int rowCount, int columnCount, QObject *parent) :
	QAbstractTableModel(parent), b(bitArray), RowCount(rowCount), ColumnCount(columnCount){}

/** Используется другими компонентами для получения информации о каждом элементе, предоставляемом моделью.*/
Qt::ItemFlags ImageModel::flags( const QModelIndex &i) const{
	if(i.isValid() && i.parent() == QModelIndex())
		return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;
	else
		return Qt::NoItemFlags;
}

/** Снабжает представления и делегаты данными элементов.*/
QVariant ImageModel::data( const QModelIndex & i, int role) const{
	if(role == Qt::CheckStateRole && i.isValid() && i.parent() == QModelIndex()){
		if(b->at(i.row() * ColumnCount + i.column()))
			return Qt::Checked;
		else
			return Qt::Unchecked;
	}else
		return QVariant();
}

/** Предоставляется представлениям с информацией для показа в их заголовках..*/
QVariant ImageModel::headerData( int section, Qt::Orientation /*orientation*/, int /*role*/) const{
	return section;
}

/** Количество строк данных, доступных в модели.*/
int ImageModel::rowCount( const QModelIndex & parent) const{
	return RowCount;
}

/** Количество столбцов данных, доступных в модели.*/
int ImageModel::columnCount( const QModelIndex & parent) const{
	return ColumnCount;
}

/** Изменяет данные элемента	, связанного с заданным модельным индексом.*/
bool ImageModel::setData( const QModelIndex & i, const QVariant & value, int role){
	if(role == Qt::CheckStateRole && i.isValid() && i.parent() == QModelIndex()){
		b->setBit(i.row() * ColumnCount + i.column(), value.toInt() == Qt::Checked);
		return true;
	}else
		return false;
}

/** Изменяет информацию в горизонтальном и вертикальном заголовках.*/
bool ImageModel::setHeaderData( int section, Qt::Orientation orientation, const QVariant & value, int role){
	return false;
}

///** Добавляет новые строки.*/
//bool ImageModel::insertRows( int row, int c, const QModelIndex & parent){
//	if(parent == QModelIndex()){
//		int n = c * ColumnCount;
//		b->resize(n);
//		for (int i = b->size() - 1; i >= row * ColumnCount; --i){
//			b->setBit(i, b->at(i - n));
//		}
//	}else
//		return false;
//}
//
///** Добавляет новую строку.*/
//bool ImageModel::insertRow( int r, const QModelIndex & p){
//	insertRows(r, 1, p);
//}
//
///** Удаляет строки.*/
//bool ImageModel::removeRows( int row, int count, const QModelIndex & parent){
//
//}
//
///** Удаляет строку.*/
//bool ImageModel::removeRow( int r, const QModelIndex & p){
//	removeRows(r, 1, p);
//}
//
///** Добавляет новые столбцы.*/
//bool ImageModel::insertColumns( int row, int count, const QModelIndex & parent){
//
//}
//
///** Добавляет новый столбец.*/
//bool ImageModel::insertColumn( int r, const QModelIndex & p){
//	insertColumns(r, 1, p);
//}
//
///** Удаляет столбцы.*/
//bool ImageModel::removeColumns( int row, int count, const QModelIndex & parent){
//
//}
//
///** Удаляет столбец.*/
//bool ImageModel::removeColumn( int r, const QModelIndex & p){
//	removeColumns(r, 1, p);
//}

/** Возвращает модельный индекс, соответствующий родителю какого-либо дочернего элемента..*/
QModelIndex ImageModel::parent( const QModelIndex &) const{
	return QModelIndex(); // У нас нет вложенных таблиц.
}

/** Массив бит, хранящий данные матрицы в одну строку.*/
QBitArray * ImageModel::bits(){
	return b;
}
